import 'reflect-metadata';
import express from 'express';
import path from 'path';
import dotenv from 'dotenv';
import routes from '@/routes';
import { getLogger } from '@/utils/logger';
import { setupMiddlewares, errorHandler, notFoundHandler } from '@/middlewares/common.middleware';
import { join } from 'path';
import dbUtils from '@/utils/db';
import monitorConfig from './config/monitor';
import './services/monitor/alert.service'; // 导入告警服务使其初始化
import jobService from './services/monitor/job.service'; // 导入定时任务服务

// 导入所有模型以确保关联关系被正确加载
import './models/system';

// 创建应用专用的日志记录器
const logger = getLogger('app');

// 加载环境变量
const env = process.env.NODE_ENV || 'development';
const defaultEnvFile = '.env';
const envFile = `.env.${env}`;

// 先加载默认.env文件，再尝试加载指定环境的配置文件
dotenv.config({ path: path.resolve(process.cwd(), defaultEnvFile) });
dotenv.config({
	path: path.resolve(process.cwd(), envFile),
	override: true  // 强制覆盖已存在的环境变量
 });

// 初始化Express应用
const app = express();
const port = process.env.PORT || 3000;
const apiPrefix = process.env.API_PREFIX || '/api';

// 配置基础中间件（包含所有基础中间件）
setupMiddlewares(app);

// 静态文件服务
app.use(express.static(join(__dirname, '../public')));

// API路由
app.use(apiPrefix, routes);

// 404处理中间件 - 必须在所有路由之后
app.use(notFoundHandler);

// 错误处理中间件 - 必须在所有中间件之后
app.use(errorHandler);

// 配置全局未捕获异常处理
process.on('uncaughtException', (error) => {
  logger.error(`未捕获的异常: ${error.message}`);
  logger.error(error.stack);
});

// 配置未处理的Promise拒绝
process.on('unhandledRejection', (reason) => {
  logger.error(`未处理的Promise拒绝: ${reason instanceof Error ? reason.message : String(reason)}`);
});

// 处理进程终止信号
process.on('SIGTERM', () => {
  logger.info('收到SIGTERM信号，优雅关闭中...');
  // 实现优雅关闭逻辑
  process.exit(0);
});

// 启动应用
const startApp = async () => {
  try {
		// 检查数据库连接
		await dbUtils.checkDatabaseConnection();
		
		// 初始化数据库表和数据
		await dbUtils.initDatabase();

		// 启动定期数据库检查
		if (env === "production") {
			dbUtils.startPeriodicDatabaseCheck();
		}

		// 初始化数据库监控
		if (monitorConfig.database.enabled) {
			dbUtils.dbMonitor.init();
		}

		// 初始化定时任务调度器
		await jobService.initScheduler();
		logger.info("定时任务调度器初始化成功");

		// 启动服务器
		app.listen(port, () => {
			logger.info(`服务器运行在: http://127.0.0.1:${port}`);
			logger.info(`环境: ${env}`);

			if (monitorConfig.server.enabled) {
				logger.info("监控服务已启动");
			}
		});
	} catch (error) {
    logger.error(`启动应用失败: ${error instanceof Error ? error.message : String(error)}`);
    process.exit(1);
  }
};

// 启动应用
startApp();

export default app; 